home *** CD-ROM | disk | FTP | other *** search
/ The AGA Experience 3 / AGA Experience Volume 3 (1997)(NFA - SAdENESS)[!].iso / software / utilities / graphics / raylab / source / ppm.c < prev    next >
C/C++ Source or Header  |  1996-08-05  |  6KB  |  221 lines

  1. /*
  2.     name:    ppm.c
  3.  
  4.     PPM 24-bit color picture support
  5.     --------------------------------
  6.  
  7.     These routines enable image input/output in 24-bit PPM format.
  8.     I know very little about the PPM format (I have only looked at
  9.     one file to figure out the format), thus I guess RayLab is not
  10.     able to read all PPM files. RayLab supports the P6 PPM format
  11.     (binary 24-bit), and the 'max-value' for input files may range
  12.     from 1 to 255, presuming that each color-component (R,G, and B)
  13.     is one byte (three bytes/pixel).
  14.  
  15.     This source-code is part of the RayLab 1.1 package, and it is provided
  16.     for your compiling pleasure.  You may use it, change it, re-compile it
  17.     etc., as long as nobody else but you receive the changes/compilations
  18.     that you have made!
  19.  
  20.     You may not use any part(s) of this source-code for your own productions
  21.     without the permission from the author of RayLab. Please read the legal
  22.     information found in the users documentation for RayLab for more details.
  23.  
  24. */
  25.  
  26.  
  27. #include  <stdlib.h>
  28. #include  <string.h>
  29.  
  30. #include  "defs.h"
  31. #include  "extern.h"
  32.  
  33.  
  34.     unsigned char    ppmdata[parraysize*3];
  35.     long        ppm_maxvalue;
  36.  
  37.  
  38. /* ---------------------------------------------------------------------
  39.    WritePpmHeader()
  40.    --------------------------------------------------------------------- */
  41.  
  42. void WritePpmHeader(FILE *f,long width, long height)
  43. {
  44.         fprintf(f,"P6"); fputc((char)10,f);
  45.         fprintf(f,"%ld %ld",width,height); fputc((char)10,f);
  46.         fprintf(f,"%d",255); fputc((char)10,f);
  47. }
  48.  
  49.  
  50. /* ---------------------------------------------------------------------
  51.    CleanupPpm()
  52.    --------------------------------------------------------------------- */
  53.  
  54. void CleanupPpm(FILE *f)
  55. {
  56.     /* Not supported!! */
  57.     /* To make a proper Cleanup(), you need to be able to */
  58.     /* over-write the height value in the beginning of the */
  59.     /* file, which can be tricky as the PPM format uses ascii */
  60.     /* numbers, which occupies more or less space in the file */
  61.     /* depending on the magnitude of the number. */
  62. }
  63.  
  64.  
  65. /* ---------------------------------------------------------------------
  66.    WritePpmLine()
  67.    --------------------------------------------------------------------- */
  68.  
  69. void WritePpmLine(FILE *f, long width)
  70. {
  71.     long    i;
  72.     unsigned char *pixels;
  73.  
  74.     pixels=ppmdata;
  75.     for(i=0;i<width;i++) {
  76.         *pixels++=pixelarray[i].r;    /* Use order: r,g,b */
  77.         *pixels++=pixelarray[i].g;
  78.         *pixels++=pixelarray[i].b;
  79.     }
  80.     (void) fwrite((void *)ppmdata,sizeof(unsigned char),(size_t)(width*3),f);
  81. }
  82.  
  83.  
  84. /* ---------------------------------------------------------------------
  85.    ReadPpmHeader()
  86.    --------------------------------------------------------------------- */
  87.  
  88. void ReadPpmHeader(FILE *f, long *width, long *height)
  89. {
  90.     int    i, itmp;
  91.     long    tmpwidth, tmpheight;
  92.     char    buffer[20];
  93.  
  94.     tmpwidth=tmpheight=*width=*height=-1L;
  95.  
  96.     fread((void *)buffer,sizeof(char),(size_t)2,f);
  97.     buffer[2]=0;
  98.     if(strcmp(buffer,"P6")==0) {
  99.         buffer[0]=0;
  100.         itmp=fgetc(f);
  101.         while((itmp!=EOF)&&(ischar(itmp)==FALSE)) itmp=fgetc(f);
  102.         i=0;
  103.         while((itmp!=EOF)&&(ischar(itmp)==TRUE)) {
  104.         buffer[i]=(char)itmp;
  105.         itmp=fgetc(f);
  106.         i++;
  107.         }
  108.         if(itmp==EOF) {
  109.         fprintf(textoutput,"\nError: Premature end of PPM file\n");
  110.         }
  111.         else {
  112.         buffer[i]=0;
  113.         tmpwidth=atol(buffer);
  114.         buffer[0]=0;
  115.         itmp=fgetc(f);
  116.         while((itmp!=EOF)&&(ischar(itmp)==FALSE)) itmp=fgetc(f);
  117.         i=0;
  118.         while((itmp!=EOF)&&(ischar(itmp)==TRUE)) {
  119.             buffer[i]=(char)itmp;
  120.             itmp=fgetc(f);
  121.             i++;
  122.         }
  123.         if(itmp==EOF) {
  124.             fprintf(textoutput,"\nError: Premature end of PPM file\n");
  125.         }
  126.         else {
  127.             buffer[i]=0;
  128.             tmpheight=atol(buffer);
  129.             buffer[0]=0;
  130.             itmp=fgetc(f);
  131.             while((itmp!=EOF)&&(ischar(itmp)==FALSE)) itmp=fgetc(f);
  132.             i=0;
  133.             while((itmp!=EOF)&&(ischar(itmp)==TRUE)) {
  134.             buffer[i]=(char)itmp;
  135.             itmp=fgetc(f);
  136.             i++;
  137.             }
  138.             if(itmp==EOF) {
  139.             fprintf(textoutput,"\nError: Premature end of PPM file\n");
  140.             }
  141.             else {
  142.             buffer[i]=0;
  143.             ppm_maxvalue=atol(buffer);
  144.             if(ppm_maxvalue>255) {
  145.                 fprintf(textoutput,"\nError: The PPM max-value must be less than 256\n");
  146.                 tmpwidth=tmpheight=-1;
  147.             }
  148.             else {
  149.                 while((itmp!=EOF)&&(itmp!=10)) itmp=fgetc(f);
  150.             }
  151.             }
  152.         }
  153.         }
  154.         if((itmp!=EOF)&&(tmpwidth>0)&&(tmpheight>0)) {
  155.         if(tmpwidth<=parraymaxpix) {
  156.             *width=tmpwidth;
  157.             *height=tmpheight;
  158.         }
  159.         else fprintf(textoutput,"\nError: Maximum width is %d\n",parraymaxpix);
  160.         }
  161.     }
  162.     else {
  163.         fprintf(textoutput,"\nError: Not recognized as a 'P6' PPM file\n");
  164.     }
  165. }
  166.  
  167.  
  168. /* ---------------------------------------------------------------------
  169.    ReadPpmImage()
  170.    --------------------------------------------------------------------- */
  171.  
  172. short ReadPpmImage(int *ImageNum, FILE *f, long width, long height)
  173. {
  174.     short    ImageType;
  175.     int    i,j;
  176.     unsigned char *Ppmptr;
  177.     unsigned char *Bodyptr;
  178.     IMAGE24    *Image24;
  179.  
  180.     ImageType=IMG_NONE;
  181.  
  182.     if(Num24Images<maximages) {
  183.         Image24=(void *)malloc(sizeof(IMAGE24));
  184.         if(Image24!=NULL) {
  185.         Image24->XSize=width; Image24->YSize=height;
  186.         Image24->Interpolate=INTPOL_NONE;
  187.         Image24->Maptype=MAP_PLANAR;
  188.         Image24->Tile=TILE_TRUE;
  189.         Image24->Body=(unsigned char *)malloc((size_t)(width*height*3));
  190.         if(Image24->Body!=NULL) {
  191.             i=0;
  192.             Bodyptr=Image24->Body;
  193.             while(i<height) {
  194.             (void) fread(ppmdata,(size_t)1,(size_t)(3*width),f);
  195.             Ppmptr=ppmdata;
  196.             for(j=0;j<width;j++) {
  197.                 *Bodyptr++=(unsigned char)((((int)*Ppmptr++)*255)/ppm_maxvalue);
  198.                 *Bodyptr++=(unsigned char)((((int)*Ppmptr++)*255)/ppm_maxvalue);
  199.                 *Bodyptr++=(unsigned char)((((int)*Ppmptr++)*255)/ppm_maxvalue);
  200.             }
  201.             i++;
  202.             }
  203.             *ImageNum=Num24Images;
  204.             Img24Array[Num24Images]=Image24;
  205.             Num24Images++;
  206.             ImageType=IMG_24BIT;
  207.         }
  208.         else {
  209.             free(Image24);
  210.             Image24=NULL;
  211.         }
  212.         }
  213.     }
  214.     else {
  215.         fprintf(textoutput,"\nError: Maximum amount of 24-bit images exceeded\n");
  216.     }
  217.  
  218.     return(ImageType);
  219. }
  220.  
  221.